from django.shortcuts import render,HttpResponse,redirect
from myadmin.models import *  #导入后台中的所有模型
from django.contrib.auth.hashers import make_password, check_password
from django.http import JsonResponse
import json
import datetime
#订单确认页
def order(request):
    #把接受到的字符串(购物车id) 分割成列表
    cartid=request.GET.get('cartid').split(',')
    #查询所有的购物车id  [1,2,3] 中所有的值
    data=Cart.objects.filter(id__in=cartid)
    #分配数据
    context={'cartdata':data}
    return render(request,'myhome/order.html',context)

#订单创建页
def order_create(request):

    #把接受的参数强转成字典
    data=request.POST.dict()
    #把秘钥删除
    data.pop("csrfmiddlewaretoken")
    #获取购物车中的id
    cartdata=Cart.objects.filter(id__in=data['cartids'].split(','))

    #循环购物车中的所有符合条件的内容
    for x in cartdata:
        #获取商品id
        #print(x.goodsid)
        #通过goods获取商品的数量
        #print(x.goodsid.goodsunm)
        #当前购物车的数量
        #print(x.num,'-----')
        if x.goodsid.goodsunm-x.num<0:
            return HttpResponse('<script>alert("库存不足");location.href="javascript:history.go(-1)"</script>')

    #判断是否是重复提交
    if not cartdata:
        return HttpResponse('<script>alert("请不要重复提交订单");location.href="javascript:history.go(-1)"</script>')

    #POST接受格式
    #{'address': '1111', 'phone': '111', 'username': '张飒', 'cartids': '1,2'}

    #创建订单
    #实例化订单 模型
    ob=Order()
    #把从session中查找uid 并从数据库里面找到对应的对象  赋值给 订单 中 uid字段
    ob.uid=Users.objects.get(id=request.session.get('VipUser')['uid'])
    #接受POST 中传递过来的username
    ob.username=data['username']
    #接受用户的手机号
    ob.phone=data['phone']
    #接受用户的地址
    ob.address=data['address']
    ob.totalprice=0
    ob.save()

    #订单创建详情
    #获取购物车中的id
    #cartdata=Cart.objects.filter(id__in=data['cartids'].split(','))
    #默认总价
    totalprice=0
    #循环除所有的 接受到了购物车id
    for x in cartdata:
        #创建订单详情
        obinfo=OrderInfo()
        #订单id 等于 上面生成的 id
        obinfo.orderid=ob
        #订单详情中商品id 等于循环出来的商品id
        obinfo.goodsid=x.goodsid
        obinfo.num=x.num
        obinfo.save()
        #计算总价 获取购物车数量 * 购物车中的 goodsid 字段 通过该字段外检获取商品的价格
        totalprice+=x.num*x.goodsid.price
        #删除购物车中已经下单的商品
        x.delete()

    #修改订单的总价
    ob.totalprice=totalprice
    ob.save()

    #修改商品库存的数量
    res=OrderInfo.objects.filter(orderid=ob.id)
    #循环所有的订单列表中的值
    for y in res:
        #得到每个订单中的商品id
        y.goodsid.goodsunm=y.goodsid.goodsunm-y.num
        #打印商品对象
        print(y.goodsid)
        #打印商品数量 减去后的数量
        print(y.goodsid.goodsunm)
        #保存商品对象   必须通过 goodsid 外键 来保存  y只是当前订单中的对象
        y.goodsid.save()

    return HttpResponse('<script>alert("订单创建成功,正在跳转到支付页面");location.href="/order_pay?orderid='+str(ob.id)+'"</script>')

#订单处理
def order_pay(request):
    # 接收订单号
    orderid = request.GET.get('orderid')
    # 获取订单对象
    order = Order.objects.get(id=orderid)

    # 获取支付对象
    alipay = Get_AliPay_Object()

    # 生成支付的url
    query_params = alipay.direct_pay(
        subject="魅族旗舰官网",  # 商品简单描述
        out_trade_no = orderid,# 用户购买的商品订单号
        total_amount = float(order.totalprice),  # 交易金额(单位: 元 保留俩位小数)
    )

    # 支付宝网关地址（沙箱应用）
    pay_url = settings.ALIPAY_URL+"?{0}".format(query_params)
    # 页面重定向到支付页面
    return redirect(pay_url)



from web import settings
from utils.pay import AliPay

# AliPay 对象实例化
def Get_AliPay_Object():
    alipay = AliPay(
        appid=settings.ALIPAY_APPID,# APPID （沙箱应用）
        app_notify_url=settings.ALIPAY_NOTIFY_URL, # 回调通知地址
        return_url=settings.ALIPAY_NOTIFY_URL,# 支付完成后的跳转地址
        app_private_key_path=settings.APP_PRIVATE_KEY_PATH, # 应用私钥
        alipay_public_key_path=settings.ALIPAY_PUBLIC_KEY_PATH,  # 支付宝公钥
        debug=True,  # 默认False,
    )
    return alipay


from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def myhome_pay_result(request):
    # 获取对象
    alipay = Get_AliPay_Object()
    if request.method == "POST":
        # 检测是否支付成功
        # 去请求体中获取所有返回的数据：状态/订单号
        from urllib.parse import parse_qs
        # name&age=123....
        body_str = request.body.decode('utf-8')
        post_data = parse_qs(body_str)

        post_dict = {}
        for k, v in post_data.items():
            post_dict[k] = v[0]

        sign = post_dict.pop('sign', None)
        status = alipay.verify(post_dict, sign)
        print('------------------开始------------------')
        print('POST验证', status)
        print(post_dict)
        out_trade_no = post_dict['out_trade_no']

        # 修改订单状态
        dt = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        Order.objects.filter(id=out_trade_no).update(status=1,paytime=dt)
        print('------------------结束------------------')
        # 修改订单状态：获取订单号
        return HttpResponse('POST返回')
    else:
        params = request.GET.dict()
        sign = params.pop('sign', None)
        status = alipay.verify(params, sign)
        print('==================开始==================')
        print('GET验证', status)
        print('==================结束==================')
        return HttpResponse('<script>alert("支付成功");location.href="/member_order/"</script>')

def order_info(request):
    #print(request.GET)
    id=request.GET.get('id')
    #print(id)
    order=Order.objects.get(id=id)
    order_info=OrderInfo.objects.filter(orderid=Order.objects.get(id=id))
    #print(ob)
    return render(request, 'myhome/order_info.html',{'order_info':order_info,'order':order})